#define _CRT_SECURE_NO_WARNINGS
#include "include/mysql.h"


using namespace std;

// 构造函数
MysqlUser::MysqlUser(const char* Host, const char* Name, const char* Password, const char* DbName, unsigned int port, const char* Socket, unsigned long clientflag)
	:Host(Host),Name(Name),Password(Password),DbName(DbName),port(port),Socket(Socket),clientflag(clientflag){
	// 尝试连接
	conn = mysql_init(NULL);
}
//析构函数
MysqlUser::~MysqlUser() {
	disconnect();
	printf("%s\n", "Mysql destruct！");
}


bool MysqlUser::connect() {
	// 判断是否连接成功
	if (!mysql_real_connect(conn, Host, Name, Password, DbName, port, Socket, clientflag)) {
		cerr << "MySQL connection failed: " << mysql_error(conn) << endl;
		return false;
	}
	return true;
}

bool MysqlUser::setCharSet(const char* charset) {
    // 设置连接的字符编码为UTF-8
    if (mysql_set_character_set(conn, charset)) {
        cerr << "Error setting character set: " << mysql_error(conn) << endl;
        return false;
    }
    return true;
}

//断开连接
void MysqlUser::disconnect() {
	if (conn) {
		mysql_close(conn);
	}
	cout << "MySQL Anomaly Close!" << endl;
}

// 开启事务锁
bool MysqlUser::startTransaction() {
    return executeQuery("START TRANSACTION");
}

// 提交事务
bool MysqlUser::commitTransaction() {
    return executeQuery("COMMIT");
}

// 回滚事务
bool MysqlUser::rollbackTransaction() {
    return executeQuery("ROLLBACK");
}

// 执行语句
bool MysqlUser::executeQuery(const string& query) {
    if (mysql_query(conn, query.c_str())) {
        std::cerr << "Query failed: " << mysql_error(conn) << std::endl;
        return false;
    }
    return true;
}

// 插入函数
bool MysqlUser::insert(const string& query) {
    return executeQuery(query);
}

// 删除函数
bool MysqlUser::remove(const string& query) {
    return executeQuery(query);
}

// 更新函数
bool MysqlUser::update(const string& query) {
    return executeQuery(query);
}


// 查询函数
vector<vector<string>> MysqlUser::select(const string& query) {
    vector<vector<string>> results;

    if (!executeQuery(query)) {
        return results; // 返回空结果
    }

    MYSQL_RES* res = mysql_store_result(conn);
    if (res == NULL) {
        std::cerr << "Store result failed: " << mysql_error(conn) << endl;
        return results; // 返回空结果
    }

    int num_fields = mysql_num_fields(res);
    MYSQL_ROW row;

    while ((row = mysql_fetch_row(res))) {
        vector<string> row_data;
        for (int i = 0; i < num_fields; i++) {
            row_data.push_back(row[i] ? row[i] : "NULL");
        }
        results.push_back(row_data);
    }

    mysql_free_result(res);
    return results;
}


// 开启事务锁语句执行
bool MysqlUser::TransactionExecuteQuery(const string& query) {
    if (startTransaction()) {
        if (insert(query)) {
            if (commitTransaction()) {
                std::cout << "commit success!" << std::endl;
                return true;
            }
            return false;
        }
        else {
            if (rollbackTransaction()) {
                std::cout << "rollback success!" << std::endl;
                return false;
            }
            return false;
        }
    }
    return true;
}

// 时间处理
long long TurnTimeStyle(string timeStr) {
    // 创建一个用于存储解析结果的tm结构
    std::tm tm = {};

    // 使用strptime解析时间字符串（需要定义 _XOPEN_SOURCE 为至少500 以启用strptime）
    std::istringstream stream(timeStr);
    const char* fmtStr = "%Y/%m/%d %H:%M:%S";
    stream >> std::get_time(&tm, fmtStr);


    // 转换tm结构为Unix时间戳
    time_t unixTime = mktime(&tm);

    return unixTime;
}

string ParseTimeStyle(long long unixTime) {
    // 将unixTime转换为tm结构
    std::tm* timeInfo = std::localtime(&unixTime);

    // 创建一个字符串流用于格式化时间
    std::ostringstream stream;
    // 使用put_time来格式化时间，格式与TurnTimeStyle中的解析格式相对应
    stream << std::put_time(timeInfo, "%Y/%m/%d %H:%M:%S");

    // 返回格式化的时间字符串
    return stream.str();
}